package com.lemzdo.community.advice;

import com.alibaba.fastjson.JSON;
import com.lemzdo.community.dto.ResultDTO;
import com.lemzdo.community.exception.CustomizeException;
import com.lemzdo.community.exception.ErrCodeEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 自定义异常处理器
 * 通过类中方法上面加 @ExceptionHandler()指定要处理的异常，可以根据不同的异常做出不同的响应
 * 可以拦截大部分通用异常，进行处理，有些404，500等不能拦截的处理需要
 * 自定义ErrController实现ErrorController来处理
 */

@ControllerAdvice
@Slf4j
public class CustomizeExceptionHandler {


    @ExceptionHandler(Exception.class)//指定处理所有异常
    public ModelAndView handle(HttpServletRequest request, Throwable e,
                               HttpServletResponse response ,Model model) {

        //获取contentType
        String contentType = request.getContentType();

        //进行判断
        if ("application/json".equals(contentType)) {
            //返回json串对象 不跳转页面

            //定义一个resultDTO用于存放json格式串数据来返回
            ResultDTO resultDTO;
            if (e instanceof CustomizeException) {
                //异常是我们自定义的异常 抛出信息 我们定义的异常信息
                //json串格式
                resultDTO = ResultDTO.errorOf((CustomizeException) e);
            } else {
                //异常不是我们自定义的 我们不知道是什么异常 抛出信息
                log.error("服务异常",e);
                resultDTO = ResultDTO.errorOf(ErrCodeEnum.SYS_ERROR);
            }

            PrintWriter out = null;
            try {
                //设置响应回页面的格式
                response.setContentType("application/json");
                //设置状态码200 表示正常响应
                response.setStatus(200);
                //设置字符集
                response.setCharacterEncoding("utf-8");

                //建立响应输出流
                out = response.getWriter();
                //将json串对象转化为string
                out.write(JSON.toJSONString(resultDTO));

            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                //关闭响应输出流
                if(out!=null){
                    out.close();
                }
            }

            return null;

        } else {

            //错误页面跳转
            if (e instanceof CustomizeException) {

                //异常是我们自定义的异常 抛出信息 我们定义的异常信息
                model.addAttribute("message", ((CustomizeException) e).getErrMsg());
            } else {

                //异常不是我们自定义的 我们不知道是什么异常 抛出信息
                log.error("服务异常",e);
                model.addAttribute("message", ErrCodeEnum.SYS_ERROR.getErrMsg());
            }
            //返回error界面
            return new ModelAndView("error");
        }

    }

}
